package com.atguigu.spzx.manager.controller;

import com.atguigu.spzx.manager.service.SysUserService;
import com.atguigu.spzx.model.dto.system.LoginDto;
import com.atguigu.spzx.model.entity.system.SysUser;
import com.atguigu.spzx.model.vo.common.Result;
import com.atguigu.spzx.model.vo.system.LoginVo;
import com.atguigu.spzx.model.vo.system.ValidateCodeVo;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.*;

/**
 *  资源路径：
 *      协议+服务器地址+服务端端口号+资源路径
 *      http://localhost:8501/admin/system/index/login
 *
 */
@RestController
@RequestMapping("/admin/system/index")
//springmvc提供的注解：可以自动在响应报文头中配置允许跨域的头
//originPatterns: 允许跨域访问的前端服务器域名   * 通配所有
//allowCredentials:是否允许携带cookie访问
//allowedHeaders: 允许携带哪些请求头访问
//@CrossOrigin(originPatterns="*",allowCredentials="true" , allowedHeaders = "*")
@Tag(name = "首页管理模块")
public class SysIndexController {
    /*
        生成接口文档：knife4j/yapi/ swagger
        接口功能测试：
            postman、knife4j/yapi/ swagger
            ali  mockit  ..
        业务方法测试：
            单元测试
        性能测试：
            jmeter
            ab
     */
    @Resource
    SysUserService sysUserService;
    //处理登录请求的接口
    @Operation(summary = "登录接口")
    @PostMapping("/login") //get方式不可以使用RequestBody，没有请求体
    public Result login(@RequestBody LoginDto loginDto){
        //需要到redis中获取后端缓存的验证码
        LoginVo loginVo = sysUserService.login(loginDto);
        return Result.ok().data(loginVo);
    }
    //获取图片验证码
    @Operation(summary = "获取验证码")
    @GetMapping("/generateValidateCode")
    public Result generateValidateCode(){
        //springSession: spring提供的框架，可以自动将session提取到redis中缓存 无侵入
        //返回验证码图片的base64字符串+ 后端缓存验证码的key ， 后端需要redis缓存验证码图片的字符串
        ValidateCodeVo validateCodeVo = sysUserService.generateValidateCode();
        return Result.ok().data(validateCodeVo);
    }
    //根据前端提交的请求头中的token查询，返回SysUser
    @Operation(summary = "获取用户信息")
    @GetMapping("/userinfo")
    public Result userinfo(){
        SysUser sysUser = sysUserService.getUserinfo();
        return Result.ok().data(sysUser);
    }
    @Operation(summary = "注销")
    @Parameters({
            @Parameter(name = "token",required=true , description="登录token",
            in = ParameterIn.HEADER)
    })

    @PutMapping("/logout")
    public Result logout(@RequestHeader("token")String token){
        sysUserService.logout(token);
        return Result.ok().message("注销成功");
    }
}
